from django.shortcuts import render
from django.views import View
# 使用HttpResponse返回图片数据
from django.http import HttpResponse, JsonResponse
# 使用django_redis模块连接配置文件中的redis数据库
from django_redis import get_redis_connection
from apps.verifications.libs.captcha.captcha import captcha
from apps.verifications.libs.yuntongxun.ccp_sms import CCP

# 导入异步任务方法
from celery_tasks.sms_code.tasks import send_smscode

# random随机生成验证码数字
import random


# Create your views here.


class ImageView(View):
    """
        获取图片验证码
    """

    def get(self, request, uuid):
        # 1、生成图片验证码
        text, img = captcha.generate_captcha()
        # 2、保存图片验证码到redis中
        # 2-1、建立redis连接对象
        conn = get_redis_connection('verify')
        # 2-2、将图片验证码的文本数据写入redis，str类型
        conn.setex('img_%s' % uuid, 300, text)

        # content_type指定返回的数据格式
        return HttpResponse(img, content_type='image/jpg')


class SMSCodeView(View):
    """
        发送短信
    """

    def get(self, request, mobile):

        # 补充：频繁发送短信的判断，主要判断两次请求之间的时间间隔是否在一分钟之内，如果在一分钟之内，说明请求过于频繁
        #  建立redis连接获取redis数据
        conn = get_redis_connection('verify')
        # 获取标志数据
        flag_data = conn.get('flag_%s' % mobile)
        # 如果获取到标志数据，说明数据未超过有效期，还在60s内，那么两次请求之间的间隔是在60s,请求过于频繁
        if flag_data:
            return JsonResponse({'code': 400, 'errmsg': '请求过于频繁'}, status=400)
        # 1、获取前端传递的数据 查询字符串数据
        image_code = request.GET.get('image_code')  # 获取的是用户输入图片验证码
        image_code_id = request.GET.get('image_code_id')

        # 判断参数是否完整
        if not all([image_code, image_code_id]):
            return JsonResponse({'error': '参数不完整'}, status=400)
        # 2、验证数据 验证用户输入的图片验证码和在redis中保存的图片验证码是否一致

        # 2-2 从redis中获取验证码信息 注意：从redis中获取的数据是bytes类型
        real_smscode = conn.get('img_%s' % image_code_id)
        real_smscode = real_smscode.decode()
        # 2-3 比对验证是否一致
        if real_smscode.lower() != image_code.lower():
            return JsonResponse({'error': '验证码错误'}, status=400)

        # 3、生成短信验证码
        # data=random.randint(0, 999999)
        # data1='%06d' % 123
        sms_code = '%06d' % random.randint(0, 999999)
        print(sms_code)
        # 4、保存短信验证码
        # conn.setex('sms_code_%s' % mobile, 300, sms_code)
        # # 增加判断时间间隔的标志数据
        # conn.setex('flag_%s' % mobile, 60, 'flag_data')
        # 使用管道写入数据
        # 使用pipeline()生成管道对象
        pipe = conn.pipeline()
        # 将radis的写入数据的命令存入管道
        pipe.setex('sms_code_%s' % mobile, 300, sms_code)
        pipe.setex('flag_%s' % mobile, 60, 'flag_data')
        # 执行管道命令
        pipe.execute()
        # 5、发送短信
        # ccp = CCP()
        # ccp.send_template_sms(mobile, [sms_code, 5], 1)
        # 使用celery，异步调用发送短信方法,delay方法中传递参数
        send_smscode.delay(mobile, sms_code)
        # 6、返回结果
        return JsonResponse({'errmsg': 'ok'})
